package hc.uco

import java.util.Calendar;
import java.util.Date

class Paciente {
	
	static searchable = [only: ['nome', 'hc', 'genero', 'numeroEstudo', 'hospitalInternacao', 'dataInclusao', 'hospitalizado']]
	
	Boolean hospitalizado = false
	Boolean inclusaoEstudo = false
	String nome
	String hc
	String numeroEstudo
	String genero
	String  primeiroHospital
	Date transferenciaPara
	String hospitalInternacao
	Date dataNascimento
	Integer idade
	String profissao
	Integer escolaridadeAnos
	Long rendaFamiliar
	Date dataInclusao 
	String cpf
	String nomeMae
	String endereco
	String cidade
	String estado="SP"
	String bairro
	String cep
	String telefone1
	String telefone2
	String telefone3
	String telefone4
	String telefone5
	String observacoes
	
	Boolean usoAAS = false
	
	String diagnosticoAdmissao
	
	Date inicioDor
	Date chegadaPrimeiroHospital 
	Integer deltaT
	Date ecgDiagnostico 
	Boolean iamAnterior = false
	Boolean iamInferior = false
	Boolean iamDorsal = false
	Boolean iamLateral = false
	Boolean iamVentriculoDireito = false
	
	Integer paS
	Integer paD 
	Integer fc
	Integer peso
	Integer altura
	Integer circAbd	
	Integer killip
	
	Boolean angina24horas = false
	Integer episodiosAngina24horas
	
	Usuario createdBy
	Usuario updatedBy
	Date dateCreated
	Date lastUpdated
	
	static transients = [ "idade", "deltaT" ]
	
	static hasMany = [medicacao: Medicacao, evolucao: Evolucao, historiaPregressa: HistoriaPregressa, riscos: Riscos, examesAdmissao: ExamesAdmissao]
	
    static constraints = {
		nome blank: false, unique: true, size:5..200
		hc blank: false, unique: true
		numeroEstudo blank: false, unique: true, size:3..15
		genero blank: false, inList:["Masculino", "Feminino"]
		primeiroHospital blank: false, size:3..200
		transferenciaPara blank: false
		hospitalInternacao blank: false, inList:["Hospital 1", "Hospital 2", "Hospital 3"]
		dataNascimento blank: false
		profissao blank: false, size:3..50
		escolaridadeAnos blank: false
		rendaFamiliar blank: false
		dataInclusao blank: false
		cpf blank: false, matches: "([0-9]{3}\\.){2}[0-9]{3}-[0-9]{2}"
		nomeMae blank: false
		endereco blank: false
		cidade blank: false
		estado(inList:['AC', 'AL', 'AP', 'AM', 'BA', 'CE', 'DF', 'ES', 'GO', 'MA', 'MT', 'MS', 'MG', 'PA', 'PB', 'PR', 'PE', 'PI', 'RJ', 'RN', 'RO', 'RR', 'RS', 'SC', 'SE', 'SP', 'TO'],blank:false)
		bairro blank: false, maxSize: 50
		cep blank: false, matches:"\\d{5}[-]{1}\\d{3}"
		telefone1 blank: false, matches:"[(]{1}\\d{2}[)]{1}[ ]{1}\\d{4}[-]{1}\\d{4}"
		telefone2 blank: true, matches:"[(]{1}\\d{2}[)]{1}[ ]{1}\\d{4}[-]{1}\\d{4}"
		telefone3 blank: true, matches:"[(]{1}\\d{2}[)]{1}[ ]{1}\\d{4}[-]{1}\\d{4}"
		telefone4 blank: true, matches:"[(]{1}\\d{2}[)]{1}[ ]{1}\\d{4}[-]{1}\\d{4}"
		telefone5 blank: true, matches:"[(]{1}\\d{2}[)]{1}[ ]{1}\\d{4}[-]{1}\\d{4}"
		observacoes blank: true, maxSize: 800
		
		diagnosticoAdmissao blank: false, inList:["IAM CSST", "IAM SSST", "Angina Instável"]
		
		inicioDor blank: false
		chegadaPrimeiroHospital blank: false
		ecgDiagnostico blank: false
		paS nullable: false, min: 10, max: 240
		paD nullable: false, min: 10, max: 140
		fc  nullable: false, min: 10, max: 300
		peso nullable: false, min: 20, max: 300
		altura nullable: false, min: 140, max: 250
		circAbd nullable: false, min: 40, max: 200
		killip nullable: false, inList:[1,2,3,4]
		
		episodiosAngina24horas blank: true, nullable: true
    }
	
	@Override
	public String toString() {
		return nome + " / " + hc + " / " + numeroEstudo;
	}
	
	Integer getIdade() {
		//return 0;
		Calendar now = Calendar.getInstance();
		Calendar dob = Calendar.getInstance();
		dob.setTime(dataNascimento);
		if (dob.after(now)) {
		  return -1
		}
		int year1 = now.get(Calendar.YEAR);
		int year2 = dob.get(Calendar.YEAR);
		int age = year1 - year2;
		int month1 = now.get(Calendar.MONTH);
		int month2 = dob.get(Calendar.MONTH);
		if (month2 > month1) {
		  age--;
		} else if (month1 == month2) {
		  int day1 = now.get(Calendar.DAY_OF_MONTH);
		  int day2 = dob.get(Calendar.DAY_OF_MONTH);
		  if (day2 > day1) {
		    age--;
		  }
		}

		return age;

	}
	
	String getDeltaT() {
		Calendar dataInicioDor = Calendar.getInstance();
		dataInicioDor.setTime(inicioDor);
		Calendar dataChegadaHospital = Calendar.getInstance();
		dataChegadaHospital.setTime(chegadaPrimeiroHospital);
		
		long tempoInicioDor = 0;
		long tempoChegadaHospital = 0;
		
		int diaInicioDor = dataInicioDor.get(Calendar.DAY_OF_YEAR);
		int horaInicioDor = dataInicioDor.get(Calendar.HOUR_OF_DAY);
		int minutoInicioDor = dataInicioDor.get(Calendar.MINUTE);
		tempoInicioDor = minutoInicioDor + (horaInicioDor * 60) + (diaInicioDor * 60 * 24); 
		
		int diaChegadaHospital = dataChegadaHospital.get(Calendar.DAY_OF_YEAR);
		int horaChegadaHospital = dataChegadaHospital.get(Calendar.HOUR_OF_DAY);
		int minutoChegadaHospital = dataChegadaHospital.get(Calendar.MINUTE);
		tempoChegadaHospital = minutoChegadaHospital + (horaChegadaHospital * 60) + (diaChegadaHospital * 60 * 24);
		
		long diferenca = tempoChegadaHospital - tempoInicioDor;
		
		int horas = diferenca / 60;
		int minutos = diferenca % 60; 
		
		String horas_string = horas.toString();
		String minutos_string = minutos.toString();
		
		String retorno = horas_string + ":" + minutos_string;
				
		return retorno;
		
 	}
	
}
